Godot: Viewport
ゲーム実行時にデフォルトで、layer number = 0 の Viewportが root ノードとなる
https://gyazo.com/a2808ad13279f16ae4dd674fe20edf2f
概要
Viewport クラスのノードを追加すると、別のview, サブスクリーンを追加できる。
独自の2D, 3Dワールドを持てる
AudioListener になれる
基本的にはデフォルトで作成される Viewport を操作すればokで、特殊な要件の時に自分で追加するノードっぽいkidooom.icon
プロパティ
たくさんある
viewport 全体に関わる設定が多い
メソッド
たくさんある
使いそうなメソッドをメモ
Camera2D get_camera_2d ( ) const
現在 active な camera 2Dを取得
Vector2 get_mouse_position ( ) const
マウスの座標を取得。よく使いそう
ViewportTexture get_texture ( ) const
viewport の texture を取得できる
スクリーンショットの作成にできる
drag関連のメソッド
Variant gui_get_drag_data ( ) const
bool gui_is_drag_successful ( ) const
bool gui_is_dragging ( ) const
input handle 関連のメソッド
void set_input_as_handled ( )
bool is_input_handled ( ) const
void warp_mouse ( Vector2 position )
マウスポインターをワープさせる
Android と iOS、Webプラットフォーム ではサポートされていない
Root 要素ではない Viewport は、render target と呼ぶ
render target は texture としてアクセスできる
Input
Viewport はそれらの子階層ノードに input event を提供する責任がある
SubViewportContainer から直接 input event を受け取らない場合、デフォルトで SubViewport は input を自動的に受信しない
Listener
Viewport は 2D or 3D sound listener として動作できる
Cameras (2D & 3D)
Camera ノードは、一番近い親の Viewport を対象として描画する。
以下のような階層構造の場合
https://gyazo.com/c8ba39505028db1a71fb12037e84c922
CameraA は Root の Viewport を対象として MeshA が描画される。MeshBは描画しない
CameraB が Viewport ノードを対象として MeshBを描画する。
Viewport 1つにつき Camera は1つだけ active にできる。
current 切り替えたい場合は、camera.make_current() を呼び出す
Scale & stretching
ビューポートには "size "プロパティがあり、ビューポートのサイズをピクセルで表す
https://gyazo.com/8231b94f13d186cca2f242e3905ffc7e
stretch の設定を有効にすることで、動的に Viewport のサイズを変更することができる
Root の Viewport では、プロジェクト設定にあるストレッチの設定値が反映されている
https://gyazo.com/e1d3bb4ad819e24d937a6bd692aa3e99
Capture
Viewport のコンテンツをキャプチャーするサンプルコード
code:gd
# Retrieve the captured Image using get_data().
var img = get_viewport().get_texture().get_data()
# Flip on the Y axis.
# You can also set "V Flip" to true if not on the root Viewport.
img.flip_y()
# Convert Image to ImageTexture.
var tex = ImageTexture.new()
tex.create_from_image(img)
# Set sprite texture.
$sprite.texture = tex
code:gd
# Wait until the frame has finished before getting the texture.
await RenderingServer.frame_post_draw
# You can get the image after this.
Viewport Container
ビューポートがSubViewportContainerの子である場合、アクティブになり、内部にあるものを表示する
https://gyazo.com/ec49b78eca313ec41df8f62eb58b69c7
Rendering
Viewport を追加することで、プロジェクト設定とは異なるレンダリングプロパティが使用できる
MSAA
HDR
3D / 2D の切り替え
2Dしか使わない場合は、Viewport を 2D Usage Mode にすることでメモリ使用量等を削減できる。
https://gyazo.com/2e12a70181cb1cbae7b7fdc8ea243908
このプロパティ
root の Viewport でこの設定を変更する方法は分からなかった...
Debug Draw のオプションがいくつかある
The other three options are Unshaded, Overdraw, and Wireframe.
Render target
ビューポートにレンダリングする場合、中にあるものはシーンエディタには表示されない。コンテンツを表示するには、ViewportのViewportTextureをどこかに描画する必要がある。
コード上でやる場合
code:gd
# This gives us the ViewportTexture.
var rtt = viewport.get_texture()
sprite.texture = rtt
editor 上でアサインする場合
https://gyazo.com/8465e0b65cf440b7215495c5000ea750
New ViewportTexture を選ぶ
毎フレーム、Viewport の Texture はデフォルトの Clear color でクリアされる。
Clear mode でクリアされないように変更可能
https://gyazo.com/5d7d8b5ef5332bdbaed94da5a0ed376d